package com.we.es.support.annotation;

import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * 
 * 分组查询的注解配置。注意：日期range不推荐使用，统一通过long类型进行处理。
 * <p>
 * 只会在查询的时候使用,查询的时候请使用和生成索引的时候相同的entity，带分片信息注解的字段必须带有@see SolrField
 * ,否则无法正确处理名称的后缀问题
 * 
 * 可以在一次查询中为不同的字段设置不同的参数
 *
 * @author   朱晓川
 * @Date	 2014-8-10 	 
 */
@Target({ ElementType.FIELD })
@Retention(RUNTIME)
public @interface FacetConfig {

	/**
	 * 设置Facet字段值以哪种顺序返回.
	 * <p>
	 * 可接受的值为true|false. 
	 * 1，true表示按照count值从大到小排列.匹配到的越多就越在前面 
	 * 2，false表示按照字段值的自然顺序(字母,数字的顺序)排列.这个比较坑，只能按照字段值由小到大
	 * <p>
	 * 默认值为true 
	 * 当facet.limit值为负数时,默认facet.sort= false.
	 */
	String sort() default "true";

	/**
	 * 限制所有字段最多只能返回多少个组.默认值为100.如果此值为负数,表示不限制.
	 */
	int limit() default 100;

	/**
	 * 设置每个组统计的最少匹配数,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.
	 */
	int mincount() default 0;

	/**
	 * 是否需要统计null值
	 * <p>
	 * 默认为false,如果设置为true,那么将统计那些该Facet字段值为null的记录.
	 */
	boolean missing() default false;

	/**
	 * 表示该字段是否需要根据日期进行分组
	 * <p>
	 * 默认值为false
	 */
	boolean date() default false;

	/**
	 * 分组起始日期
	 * <p>
	 * 当需要对某个字段进行日期分组的时候有效,日期格式只能使用"yyyy-MM-dd HH：mm：ss"
	 */
	String dateStart() default "";

	/**
	 * 分组结束日期
	 * <p>
	 * 当需要对某个字段进行日期分组的时候有效,日期格式只能使用"yyyy-MM-dd HH：mm：ss"
	 */
	String dateEnd() default "";

	/**
	 * 日期统计间隔，表示统计的时候，在起始日期之间，每多久统计一次。
	 * <p>
	 * 如果start为2009-1-1,end为2010-1-1.gap设置为+1MONTH表示间隔1个月,那么将会把这段时间划分为12个间隔段
	 */
	String dateGap() default "+1DAY";

	/**
	 * 是否按照数值区间统计
	 * <p>
	 * 默认false
	 */
	boolean range() default false;

	/**
	 * 数值统计起始值
	 * <p>
	 * 当numricRange()为true时生效
	 */
	int rangeStart() default 0;

	/**
	 * 数值统计结束值
	 * <p>
	 * 当numricRange()为true时生效
	 */
	int rangeEnd() default 10;

	/**
	 * 数值统计间隔
	 * <p>
	 * 当numricRange()为true时生效
	 */
	int rangeGap() default 1;

	/**
	 * 表示Facet字段值的前缀.
	 * <p>
	 * 注意:该参数不支持数值类型
	 * 比如facet.field=cpu&facet.prefix=Intel,那么对cpu字段进行Facet查询,返回的cpu都是以Intel开头的, AMD开头的cpu型号将不会被统计在内.
	 */
	String prefix() default "";

}
